package com.titaniume.java;

/**
 *@program: JavaSenior
 *@description: 案例：创建3个窗口卖票，总票数为100张，使用继承Thread类的方式
 *
 * 使用同步代码块解决继承Thread的方式线程安全问题
 *
 * 说明：在继承Thread类创建多线程的方式中，慎用this充当监视器，考虑使用当前类充当监视器。
 *
 *
 *@author: renfei.huang
 *@create: 2021-09-29 08:57
 */
public class WindowTest2  extends Thread{


    public static void main(String[] args) {
        Window2 t1 = new Window2();
        Window2 t2 = new Window2();
        Window2 t3 = new Window2();


        t1.setName("窗口一");
        t2.setName("窗口二");
        t3.setName("窗口三");

        t1.start();
        t2.start();
        t3.start();
    }

}


class Window2 extends Thread{

    private static int  ticket = 100;

    //必须加static 保证object唯一
    private static Object object =  new Object();

    @Override
    public void run() {
        while (true) {
            //正确的
//            synchronized (object) {
              synchronized (Window2.class){ //Class clazz = Window2.class; Window2.class 只会加载一次

              //错误的 方式 this代表t1,t2,t3三个对象
//            synchronized (this) {
                if (ticket > 0) {
                    System.out.println(getName() + "：卖票，票号为:" + ticket);
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}


